# 这是所依赖的包
import json
import logging

from django.core.paginator import Paginator
from django.http import JsonResponse
from django.shortcuts import render
from django.views import View
from django_redis import get_redis_connection

from apps.contents.models import ContentCategory
from apps.goods.models import SKU, GoodsCategory, GoodsVisitCount
from utils.center_user import LoginRequiredJSONMixin
from utils.goods import get_categories, get_breadcrumb, get_goods_specs
from datetime import date

# Create your views here.


# 这是首页图片的展示1
class IndexView(View):
    def get(self,request):
        # 调用我们封装好的方法
        categories = get_categories()
        # 广告数据
        #获取广告数据   1楼，2楼
        contents = {}
        # 获取数据库中的所有数据
        content_categories = ContentCategory.objects.all()
        # 循环数据，进行排序
        for cat in content_categories:
            contents[cat.key] = cat.content_set.filter(status=True).order_by('sequence')
        # 把数据传给前端
        context = {
        'categories': categories,
        'contents': contents,
        }
        #进行模版渲染
        return render(request,'index.html',context)



# 这是列表页的展示
class ListView(View):
    def get(self,request,category_id):
        # 获取页数，和每页展示的数据，以及排序的参数
        page = request.GET.get('page')
        page_size = request.GET.get('page_size')
        ordering = request.GET.get('ordering')
        # 进行获取数据进行排序
        try:
            # 获取三级菜单分类信息:
            category = GoodsCategory.objects.get(id=category_id)
        except:
            return JsonResponse({'code':400,'errmsg':'获取mysql数据出错'})
        # 查询面包屑导航
        breadcrumb = get_breadcrumb(category)
        logger = logging.getLogger('django')
        logger.info(breadcrumb)
        # 通过外键进行过滤数据
        skus = SKU.objects.filter(category=category).order_by(ordering)
        if skus.count() == 0:
            return JsonResponse({'code':400,'errmsg':'获取数据错误'})
        # 根据自定义的方法进行分页，
        # 总数据
        paginator = Paginator(skus,page_size)
        # 获取每页展示数据
        page_data = paginator.page(page)
        # 获取总页数
        total_page = paginator.num_pages
        # 定义列表
        data_list = []
        # 往列表里面添加数据
        for sku in page_data:
            data_list.append({
                'id':sku.id,
                'default_image_url':sku.default_image.url,
                'name':sku.name,
                'price':sku.price
            })
        # 转换为json数据返回给前端
        return JsonResponse({'code':0,'errmsg':'ok','breadcrumb': breadcrumb,'list':data_list,'count':total_page})


# 这是热销排行榜的展示
class HotView(View):
    """商品热销排行"""
    def get(self, request, category_id):
        # 根据销量倒序查看数据
        skus = SKU.objects.filter(category_id=category_id, is_launched=True).order_by('-sales')[:5]
        # 序列化
        hot_list= []
        for sku in skus:
            hot_list.append({
                'id':sku.id,
                'default_image_url':sku.default_image.url,
                'name':sku.name,
                'price':sku.price
            })
        return JsonResponse({'code':0, 'errmsg':'OK', 'hot_skus':hot_list})

# 这是详情页的展示
class DetailView(View):
    def get(self,request,sku_id):
        try:
            sku = SKU.objects.get(id=sku_id)
        except Exception as e:
            # 日志进行记录操作异常
            looger = logging.getLogger('django')
            looger.error(e)
            return JsonResponse({'code':400,'errmsg':'没有此商品'})
         # 查询商品频道分类
        categories = get_categories()
        # 根据外键查询面包屑导航
        breadcrumb = get_breadcrumb(sku.category)
        goods_specs=get_goods_specs(sku)
        # 渲染页面
        context = {
            'categories':categories,
            'breadcrumb':breadcrumb,
            'sku':sku,
            'specs':goods_specs
        }
        return render(request, 'detail.html', context)

# 这是详情页访问的记录
class DetailVistedView(View):
    # 进行提交数据
    def post(self, request, category_id):
        try:
            # 1.根据id获取当前商品
            category = GoodsCategory.objects.get(id=category_id)
        except:
            return JsonResponse({'code': 400, 'errmsg': '缺少必传参数'})
        # 获取当天日期
        today_date = date.today()
        # 导入访问量表
        try:
            # 3.如果有当天商品分类的数据  就累加数量
            count_data = category.goodsvisitcount_set.get(date=today_date)
        except:
            # 4. 没有, 就新建之后在增加
            count_data = GoodsVisitCount()
        try:
            count_data.count += 1
            count_data.category = category
            count_data.save()
        except:
            return JsonResponse({'code': 400, 'errmsg': '新增失败'})

        return JsonResponse({'code': 0, 'errmsg': 'OK'})








# 保存和查询浏览记录，，
class UserFindView(LoginRequiredJSONMixin,View):
    def post(self,request):
        json_list = json.loads(request.body.decode())
        sku_id = json_list.get('sku_id')
        try:
            SKU.objects.get(id=sku_id)
        except SKU.DoesNotExist:
            return JsonResponse({'code':400,'errmsg':'商品不存在'})
        # 保存浏览记录的数据，通过django_redis,进行保存
        redis_data = get_redis_connection('history')
        # 管道，可以提高redis执行效率，减少redis的压力
        pl = redis_data.pipeline()
        user_id = request.user.id
         # 先去重
        pl.lrem('history_%s' % user_id, 0, sku_id)
        # redis_data.lrem(f'history_{user_id}',0,sku_id)
        # 再存储,进行列表的存储
        pl.lpush('history_%s' % user_id, sku_id)
        # redis_data.lpush(f'history_{user_id}', sku_id)
        # 最后截取，截取从0位到4位的浏览记录
        pl.ltrim('history_%s' % user_id, 0, 4)
        # 执行管道
        pl.execute()
        return JsonResponse({'code':0,'errmsg':'ok'})

# 历史访问记录的查询         从redis里面获取数据  获取访问数据
    def get(self,request):
        redis_data = get_redis_connection('history')
        # 进行列表的查询，，，，，，，从头到尾进行查询
        sku_ids = redis_data.lrange('history_%s' % request.user.id, 0, -1)
        # 根据sku_ids列表数据，查询出商品sku信息
        skus = []
        for sku_id in sku_ids:
            # 从数据库中获取sku_id
            sku = SKU.objects.get(id=sku_id)
            skus.append({
                'id': sku.id,
                'name': sku.name,
                'default_image_url': sku.default_image.url,
                'price': sku.price
            })
        return JsonResponse({'code': 0, 'errmsg': 'OK', 'skus': skus})















